home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 11 / Info-Mac_XI_Disc_1.cdr_ / Info-Mac XI Disc 1.cdr / Programs / Science & Math / MacEspresso 1.0 / espresso / cubestr.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-02-26  |  4.2 KB  |  144 lines  |  [TEXT/R*ch]

  1. /*
  2.     Module: cubestr.c -- routines for managing the global cube structure
  3. */
  4.  
  5. #include "espresso.h"
  6.  
  7. /*
  8.     cube_setup -- assume that the fields "num_vars", "num_binary_vars", and
  9.     part_size[num_binary_vars .. num_vars-1] are setup, and initialize the
  10.     rest of cube and cdata.
  11.  
  12.     If a part_size is < 0, then the field size is abs(part_size) and the
  13.     field read from the input is symbolic.
  14. */
  15. void cube_setup()
  16. {
  17.     register int i, var;
  18.     register pcube p;
  19.  
  20.     if (cube.num_binary_vars < 0 || cube.num_vars < cube.num_binary_vars)
  21.     fatal("cube size is silly, error in .i/.o or .mv");
  22.  
  23.     cube.num_mv_vars = cube.num_vars - cube.num_binary_vars;
  24.     cube.output = cube.num_mv_vars > 0 ? cube.num_vars - 1 : -1;
  25.  
  26.     cube.size = 0;
  27.     cube.first_part = ALLOC(int, cube.num_vars);
  28.     cube.last_part = ALLOC(int, cube.num_vars);
  29.     cube.first_word = ALLOC(int, cube.num_vars);
  30.     cube.last_word = ALLOC(int, cube.num_vars);
  31.     for(var = 0; var < cube.num_vars; var++) {
  32.     if (var < cube.num_binary_vars)
  33.         cube.part_size[var] = 2;
  34.     cube.first_part[var] = cube.size;
  35.     cube.first_word[var] = WHICH_WORD(cube.size);
  36.     cube.size += ABS(cube.part_size[var]);
  37.     cube.last_part[var] = cube.size - 1;
  38.     cube.last_word[var] = WHICH_WORD(cube.size - 1);
  39.     }
  40.  
  41.     cube.var_mask = ALLOC(pset, cube.num_vars);
  42.     cube.sparse = ALLOC(int, cube.num_vars);
  43.     cube.binary_mask = new_cube();
  44.     cube.mv_mask = new_cube();
  45.     for(var = 0; var < cube.num_vars; var++) {
  46.     p = cube.var_mask[var] = new_cube();
  47.     for(i = cube.first_part[var]; i <= cube.last_part[var]; i++)
  48.         set_insert(p, i);
  49.     if (var < cube.num_binary_vars) {
  50.         INLINEset_or(cube.binary_mask, cube.binary_mask, p);
  51.         cube.sparse[var] = 0;
  52.     } else {
  53.         INLINEset_or(cube.mv_mask, cube.mv_mask, p);
  54.         cube.sparse[var] = 1;
  55.     }
  56.     }
  57.     if (cube.num_binary_vars == 0)
  58.     cube.inword = -1;
  59.     else {
  60.     cube.inword = cube.last_word[cube.num_binary_vars - 1];
  61.     cube.inmask = cube.binary_mask[cube.inword] & DISJOINT;
  62.     }
  63.  
  64.     cube.temp = ALLOC(pset, CUBE_TEMP);
  65.     for(i = 0; i < CUBE_TEMP; i++)
  66.     cube.temp[i] = new_cube();
  67.     cube.fullset = set_fill(new_cube(), cube.size);
  68.     cube.emptyset = new_cube();
  69.  
  70.     cdata.part_zeros = ALLOC(int, cube.size);
  71.     cdata.var_zeros = ALLOC(int, cube.num_vars);
  72.     cdata.parts_active = ALLOC(int, cube.num_vars);
  73.     cdata.is_unate = ALLOC(int, cube.num_vars);
  74. }
  75.  
  76. /*
  77.     setdown_cube -- free memory allocated for the cube/cdata structs
  78.     (free's all but the part_size array)
  79.  
  80.     (I wanted to call this cube_setdown, but that violates the 8-character
  81.     external routine limit on the IBM !)
  82. */
  83. void setdown_cube()
  84. {
  85.     register int i, var;
  86.  
  87.     FREE(cube.first_part);
  88.     FREE(cube.last_part);
  89.     FREE(cube.first_word);
  90.     FREE(cube.last_word);
  91.     FREE(cube.sparse);
  92.  
  93.     free_cube(cube.binary_mask);
  94.     free_cube(cube.mv_mask);
  95.     free_cube(cube.fullset);
  96.     free_cube(cube.emptyset);
  97.     for(var = 0; var < cube.num_vars; var++)
  98.     free_cube(cube.var_mask[var]);
  99.     FREE(cube.var_mask);
  100.  
  101.     for(i = 0; i < CUBE_TEMP; i++)
  102.     free_cube(cube.temp[i]);
  103.     FREE(cube.temp);
  104.  
  105.     FREE(cdata.part_zeros);
  106.     FREE(cdata.var_zeros);
  107.     FREE(cdata.parts_active);
  108.     FREE(cdata.is_unate);
  109.  
  110.     cube.first_part = cube.last_part = (int *) NULL;
  111.     cube.first_word = cube.last_word = (int *) NULL;
  112.     cube.sparse = (int *) NULL;
  113.     cube.binary_mask = cube.mv_mask = (pcube) NULL;
  114.     cube.fullset = cube.emptyset = (pcube) NULL;
  115.     cube.var_mask = cube.temp = (pcube *) NULL;
  116.  
  117.     cdata.part_zeros = cdata.var_zeros = cdata.parts_active = (int *) NULL;
  118.     cdata.is_unate = (bool *) NULL;
  119. }
  120.  
  121.  
  122. void save_cube_struct()
  123. {
  124.     temp_cube_save = cube;              /* structure copy ! */
  125.     temp_cdata_save = cdata;            /*      ""          */
  126.  
  127.     cube.first_part = cube.last_part = (int *) NULL;
  128.     cube.first_word = cube.last_word = (int *) NULL;
  129.     cube.part_size = (int *) NULL;
  130.     cube.binary_mask = cube.mv_mask = (pcube) NULL;
  131.     cube.fullset = cube.emptyset = (pcube) NULL;
  132.     cube.var_mask = cube.temp = (pcube *) NULL;
  133.  
  134.     cdata.part_zeros = cdata.var_zeros = cdata.parts_active = (int *) NULL;
  135.     cdata.is_unate = (bool *) NULL;
  136. }
  137.  
  138.  
  139. void restore_cube_struct()
  140. {
  141.     cube = temp_cube_save;              /* structure copy ! */
  142.     cdata = temp_cdata_save;            /*      ""          */
  143. }
  144.